package com.zyb.lmbackend.util;

import java.util.List;

/**
 * 简单的“令牌预算”估算与分片工具。
 *
 * 通过粗略的字符数近似 token 数，控制每批输入大小，避免模型提示超限。
 */
public final class TokenBudget {
    private TokenBudget() {}

    /** 估算单条文本的大致 token 数。 */
    public static int estimateTokens(String s) {
        if (s == null) return 0;
        int chars = s.length();
        return (int) Math.ceil(chars * 1.5);
    }

    /** 估算多条文本合计 token 数。 */
    public static int estimateTokens(List<String> arr) {
        int sum = 0;
        for (String s : arr) {
            sum += estimateTokens(s);
        }
        return sum;
    }

    /**
     * 基于二分搜索在 [1, defaultSize] 中找到不超过 maxTokens 的最大分片条数。
     */
    public static int fitChunkSize(List<String> arr, int defaultSize, int maxTokens) {
        int n = Math.min(defaultSize, arr.size());
        int lo = 1, hi = n, best = 1;
        while (lo <= hi) {
            int mid = (lo + hi) >>> 1;
            int tokens = estimateTokens(arr.subList(0, mid));
            if (tokens <= maxTokens) {
                best = mid;
                lo = mid + 1;
            } else {
                hi = mid - 1;
            }
        }
        return Math.max(1, best);
    }
}
